import axios from 'axios'
import router from '@/router'
import { ElNotification, ElMessageBox, ElMessage, ElLoading } from 'element-plus'
import { getToken } from '@/utils/token'
const errorCode = {
  401: '认证失败，无法访问系统资源',
  403: '当前操作没有权限',
  404: '访问资源不存在',
  default: '系统未知错误，请反馈给管理员',
}
const CONTENT_TYPE = {
  json: 'application/json;charset=utf-8',
  formdata: 'application/x-www-form-urlencoded',
  form: '',
}

const baseUrl = import.meta.env.MODE === 'development' ? '/api' : 'http://127.0.0.1:8800'
class HttpRequest {
  constructor(baseUrl) {
    this.baseUrl = baseUrl
    axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
    this.instance = axios.create() // 创造实例对象
    this.interceptors(this.instance)
  }
  interceptors(instance) {
    instance.interceptors.request.use((config) => {
      // 处理config
      const isToken = (config.headers || {}).isToken === false
      if (getToken() && !isToken) {
        config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
      }
      // config.headers['Content-Type'] = CONTENT_TYPE.json
      if (config.dataType == 'formdata') {
        config.headers['Content-Type'] = CONTENT_TYPE.formdata
      }
      return config
    })
    instance.interceptors.response.use(
      (res) => {
        // 处理响应
        // 未设置状态码则默认成功状态
        const code = res.data.code || 200
        // 获取错误信息
        const msg = errorCode[code] || res.data.msg || errorCode['default']
        // 二进制数据则直接返回
        if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
          return res.data
        }
        if (code === 401) {
          ElMessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning',
          }).then(() => {
            router.push({
              name: 'Login',
            })
          })
          return Promise.reject('无效的会话，或者会话已过期，请重新登录。')
        } else if (code === 500) {
          ElMessage({
            message: msg,
            type: 'error',
            showClose: true,
          })
          return Promise.reject(new Error(msg))
        } else if (code !== 200) {
          ElNotification.error({
            title: msg,
          })
          return Promise.reject('error')
        } else {
          return Promise.resolve(res.data)
        }
      },
      (error) => {
        // 请求出问题，处理问题
        console.log(error)
        return { error: '网络出错了' }
      }
    )
  }
  request(options) {
    options.url = this.baseUrl + options.url
    return this.instance(options)
  }
  get(url, params, responseType) {
    return this.instance.get(this.baseUrl + url, { params, responseType })
  }
  post(url, data, params) {
    let dataType = ''
    if (data && data.constructor.name === 'FormData') {
      dataType = 'formdata'
    }
    return this.instance.post(this.baseUrl + url, data, { params, dataType })
  }
}

const axiosObj = new HttpRequest(baseUrl)
export default axiosObj
